package com.cencat.order.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 智能派单视图对象
 * 
 * @author cencat
 * @date 2024-01-20
 */
@Data
@Accessors(chain = true)
public class DispatchVO implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 派单ID
     */
    private Long dispatchId;

    /**
     * 派单编号
     */
    private String dispatchCode;

    /**
     * 订单ID
     */
    private Long orderId;

    /**
     * 订单编号
     */
    private String orderCode;

    /**
     * 路线ID
     */
    private Long routeId;

    /**
     * 路线编号
     */
    private String routeCode;

    /**
     * 路线名称
     */
    private String routeName;

    /**
     * 司机ID
     */
    private Long driverId;

    /**
     * 司机编号
     */
    private String driverCode;

    /**
     * 司机姓名
     */
    private String driverName;

    /**
     * 司机手机号
     */
    private String driverPhone;

    /**
     * 车辆ID
     */
    private Long vehicleId;

    /**
     * 车牌号
     */
    private String vehicleNumber;

    /**
     * 车辆类型
     */
    private String vehicleType;

    /**
     * 商家ID
     */
    private Long merchantId;

    /**
     * 商家编号
     */
    private String merchantCode;

    /**
     * 商家名称
     */
    private String merchantName;

    /**
     * 派单类型(1-智能派单 2-手动派单 3-紧急派单)
     */
    private Integer dispatchType;

    /**
     * 派单类型描述
     */
    private String dispatchTypeDesc;

    /**
     * 派单方式(1-系统自动 2-人工指派 3-司机抢单)
     */
    private Integer dispatchMethod;

    /**
     * 派单方式描述
     */
    private String dispatchMethodDesc;

    /**
     * 派单状态(0-待派单 1-已派单 2-已接单 3-已拒绝 4-已取消 5-已完成 6-异常)
     */
    private Integer dispatchStatus;

    /**
     * 派单状态描述
     */
    private String dispatchStatusDesc;

    /**
     * 优先级(1-低 2-中 3-高 4-紧急)
     */
    private Integer priority;

    /**
     * 优先级描述
     */
    private String priorityDesc;

    /**
     * 紧急程度(1-普通 2-紧急 3-特急)
     */
    private Integer urgencyLevel;

    /**
     * 紧急程度描述
     */
    private String urgencyLevelDesc;

    /**
     * 货物名称
     */
    private String goodsName;

    /**
     * 货物重量(kg)
     */
    private BigDecimal goodsWeight;

    /**
     * 货物体积(立方米)
     */
    private BigDecimal goodsVolume;

    /**
     * 货物数量
     */
    private Integer goodsQuantity;

    /**
     * 货物价值
     */
    private BigDecimal goodsValue;

    /**
     * 取货地址
     */
    private String pickupAddress;

    /**
     * 取货联系人
     */
    private String pickupContact;

    /**
     * 取货联系电话
     */
    private String pickupPhone;

    /**
     * 配送地址
     */
    private String deliveryAddress;

    /**
     * 配送联系人
     */
    private String deliveryContact;

    /**
     * 配送联系电话
     */
    private String deliveryPhone;

    /**
     * 预计距离(公里)
     */
    private BigDecimal estimatedDistance;

    /**
     * 预计时长(分钟)
     */
    private Integer estimatedDuration;

    /**
     * 预计费用
     */
    private BigDecimal estimatedFee;

    /**
     * 实际距离(公里)
     */
    private BigDecimal actualDistance;

    /**
     * 实际时长(分钟)
     */
    private Integer actualDuration;

    /**
     * 实际费用
     */
    private BigDecimal actualFee;

    /**
     * 派单时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime dispatchTime;

    /**
     * 接单时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime acceptTime;

    /**
     * 拒绝时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime rejectTime;

    /**
     * 拒绝原因
     */
    private String rejectReason;

    /**
     * 取消时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime cancelTime;

    /**
     * 取消原因
     */
    private String cancelReason;

    /**
     * 完成时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime completeTime;

    /**
     * 预计开始时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime estimatedStartTime;

    /**
     * 预计结束时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime estimatedEndTime;

    /**
     * 实际开始时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime actualStartTime;

    /**
     * 实际结束时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime actualEndTime;

    /**
     * 算法版本
     */
    private String algorithmVersion;

    /**
     * 匹配得分
     */
    private BigDecimal matchScore;

    /**
     * 派单规则
     */
    private String dispatchRule;

    /**
     * 重试次数
     */
    private Integer retryCount;

    /**
     * 最大重试次数
     */
    private Integer maxRetryCount;

    /**
     * 超时时间(分钟)
     */
    private Integer timeoutMinutes;

    /**
     * 是否超时
     */
    private Boolean isTimeout;

    /**
     * 异常信息
     */
    private String exceptionInfo;

    /**
     * 处理人
     */
    private String handlerName;

    /**
     * 处理时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime handleTime;

    /**
     * 处理结果
     */
    private String handleResult;

    /**
     * 评价分数
     */
    private BigDecimal ratingScore;

    /**
     * 评价内容
     */
    private String ratingContent;

    /**
     * 评价时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime ratingTime;

    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}